#include <iostream>
#include <string>
#include "LFUCache.hpp"

int main()
{
    std::cout << "=== LFU Cache 淘汰策略测试 ===\n\n";

    // 创建一个容量为 3 的缓存
    LFUCache<std::string, int> cache(3);

    // 设置淘汰回调，观察淘汰过程
    cache.set_eviction_callback([](const std::string &key, int value)
                                {
                                    std::cout << "[淘汰] 键='" << key << "', 值=" << value << "\n";
                                });

    std::cout << "1. 添加 A(1), B(2), C(3) 到空缓存\n";
    cache.put("A", 1);
    cache.put("B", 2);
    cache.put("C", 3);
    std::cout << "   缓存大小: " << cache.size() << "/" << cache.capacity() << "\n\n";

    std::cout << "2. 访问 A 两次, B 一次 (增加频率)\n";
    int val;
    cache.get("A", val);
    cache.get("A", val); // A 的频率变为 3
    cache.get("B", val); // B 的频率变为 2
    // C 的频率仍为 1
    std::cout << "   当前频率: A=3, B=2, C=1\n\n";

    std::cout << "3. 添加 D(4) -> 缓存满，需淘汰\n";
    std::cout << "   淘汰策略: 频率最低的是 C(1次)，所以 C 被淘汰\n";
    cache.put("D", 4);
    std::cout << "   缓存大小: " << cache.size() << "/" << cache.capacity() << "\n\n";

    std::cout << "4. 访问 D 两次 (D 的频率变为 3)\n";
    cache.get("D", val);
    cache.get("D", val);
    std::cout << "   当前频率: A=3, B=2, D=3\n\n";

    std::cout << "5. 添加 E(5) -> 缓存满，需淘汰\n";
    std::cout << "   淘汰策略: A 和 D 频率最高(3次)，B 频率最低(2次)，所以 B 被淘汰\n";
    cache.put("E", 5);
    std::cout << "   缓存大小: " << cache.size() << "/" << cache.capacity() << "\n\n";

    std::cout << "6. 尝试获取被淘汰的 C 和 B\n";
    if (!cache.get("C", val))
    {
        std::cout << "   无法获取 C: 已被淘汰 ✅\n";
    }
    if (!cache.get("B", val))
    {
        std::cout << "   无法获取 B: 已被淘汰 ✅\n";
    }

    std::cout << "\n7. 当前缓存中的键值对:\n";
    cache.for_each([](const std::string &k, int v)
                   {
                       std::cout << "   " << k << " -> " << v << "\n";
                   });

    std::cout << "\n8. 测试完成，缓存清理...\n";
    cache.clear();
    std::cout << "   缓存已清空。\n";

    return 0;
}